package org.mango.bean;

import com.baidu.unbiz.fluentvalidator.FluentValidator;
import com.baidu.unbiz.fluentvalidator.Result;
import com.baidu.unbiz.fluentvalidator.annotation.FluentValidate;
import com.baidu.unbiz.fluentvalidator.jsr303.HibernateSupportedValidator;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Range;
import org.mango.validator.fluent.common.IdcardValidator;
import org.mango.validator.fluent.common.PhoneValidator;
import org.mango.validator.fluent.common.UrlValidator;
import org.mango.validator.fluent.common.ZipCodeValidator;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.Validation;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import java.util.Date;

import static com.baidu.unbiz.fluentvalidator.ResultCollectors.toSimple;

/**
 * Created by meigang on 17/9/11.
 * --------------------------------------------------------------------------------
 * Bean Validation 中内置的 constraint
 2 @Null   被注释的元素必须为 null
 3 @NotNull    被注释的元素必须不为 null
 4 @AssertTrue     被注释的元素必须为 true
 5 @AssertFalse    被注释的元素必须为 false
 6 @Min(value)     被注释的元素必须是一个数字，其值必须大于等于指定的最小值
 7 @Max(value)     被注释的元素必须是一个数字，其值必须小于等于指定的最大值
 8 @DecimalMin(value)  被注释的元素必须是一个数字，其值必须大于等于指定的最小值
 9 @DecimalMax(value)  被注释的元素必须是一个数字，其值必须小于等于指定的最大值
 10 @Size(max=, min=)   被注释的元素的大小必须在指定的范围内
 11 @Digits (integer, fraction)     被注释的元素必须是一个数字，其值必须在可接受的范围内
 12 @Past   被注释的元素必须是一个过去的日期
 13 @Future     被注释的元素必须是一个将来的日期
 14 @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式
 15--------------------------------------------------------------------------------
 16 Hibernate Validator 附加的 constraint
 17 @NotBlank(message =)   验证字符串非null，且长度必须大于0
 18 @Email  被注释的元素必须是电子邮箱地址
 19 @Length(min=,max=)  被注释的字符串的大小必须在指定的范围内
 20 @NotEmpty   被注释的字符串的必须非空
 21 @Range(min=,max=,message=)  被注释的元素必须在合适的范围内
 22 --------------------------------------------------------------------------------
 */
public class DemoBean {

    @NotNull(message = "姓名不能为空")
    private String name;

    @NotNull(message = "年龄不能为空")
    @Range(min=1,max = 120,message = "年龄必须在1-120岁之间")
    private int age;

    @DateTimeFormat(pattern="yyyy-MM-dd")
    @NotNull(message = "出生日期不能为空")
    @Past(message = "出生日期必须比实际日期小")
    private Date birthday;

    @NotNull(message = "电子邮件不能为空")
    @Email(message = "电子邮件格式不正确")
    private String email;

    @FluentValidate({PhoneValidator.class})
    private String phone;

    @FluentValidate({UrlValidator.class})
    private String url;

    @FluentValidate({ZipCodeValidator.class})
    private String zipcode;

    @FluentValidate({IdcardValidator.class})
    private String idcard;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public String getIdcard() {
        return idcard;
    }

    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }


    public static void main(String[] args){
        DemoBean db = new DemoBean();
        //db.setName("xxx");
        //获取hibernate validator实例，目前直接生成。后续可以spring bean配置注入
        //Locale.setDefault(Locale.ENGLISH); // speicify language
        //ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        javax.validation.Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();

        Result ret = FluentValidator.checkAll()
                .on(db, new HibernateSupportedValidator<DemoBean>().setHiberanteValidator(validator))
                .failFast()
                .setIsFailFast(true)
                .doValidate().result(toSimple());
        System.out.println(ret);
    }
}
